using WebRtcProject.Services;

namespace WebRtcProject.Services
{
    /// <summary>
    /// RabbitMQ 初始化后台服务
    /// 负责在应用启动时初始化RabbitMQ连接
    /// </summary>
    public class RabbitMQInitializationService : BackgroundService
    {
        private readonly RabbitMQService _rabbitMQService;
        private readonly ILogger<RabbitMQInitializationService> _logger;

        public RabbitMQInitializationService(
            RabbitMQService rabbitMQService,
            ILogger<RabbitMQInitializationService> logger)
        {
            _rabbitMQService = rabbitMQService;
            _logger = logger;
        }

        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            try
            {
                _logger.LogInformation("正在初始化 RabbitMQ 外部服务连接...");
                
                // 初始化RabbitMQ连接
                await _rabbitMQService.InitializeAsync();
                
                _logger.LogInformation("RabbitMQ 外部服务连接初始化完成");

                // 可选：启动消息订阅
                 await StartMessageSubscription(stoppingToken);
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "RabbitMQ 外部服务连接初始化失败");
                // 不抛出异常，让应用继续运行（RabbitMQ为可选功能）
            }

            // 保持服务运行
            await Task.Delay(Timeout.Infinite, stoppingToken);
        }

        /// <summary>
        /// 启动消息订阅（可选功能）
        /// </summary>
        private async Task StartMessageSubscription(CancellationToken stoppingToken)
        {
            try
            {
                _logger.LogInformation("开始订阅传入消息队列...");

                await _rabbitMQService.SubscribeToIncomingMessagesAsync(
                    async (message) =>
                    {
                        try
                        {
                            _logger.LogInformation("收到外部消息: {Message}", message);
                            
                            // 在这里添加您的消息处理逻辑
                            await ProcessIncomingMessage(message);
                            
                            return true; // 处理成功
                        }
                        catch (Exception ex)
                        {
                            _logger.LogError(ex, "处理传入消息失败: {Message}", message);
                            return false; // 处理失败，会重试
                        }
                    },
                    stoppingToken
                );
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "启动消息订阅失败");
            }
        }

        /// <summary>
        /// 处理传入的消息
        /// </summary>
        private async Task ProcessIncomingMessage(string message)
        {
            // 在这里实现您的消息处理逻辑
            // 例如：解析JSON消息，更新WebRTC房间状态等
            
            _logger.LogDebug("正在处理消息: {Message}", message);
            
            // 模拟处理时间
            await Task.Delay(100);
            
            _logger.LogDebug("消息处理完成");
        }

        public override void Dispose()
        {
            _rabbitMQService?.Dispose();
            base.Dispose();
        }
    }
} 